import os
import base64
import requests
from pathlib import Path
from loguru import logger


def encode_image_to_base64(image_path: str) -> str:
    """将本地图片编码为base64格式"""
    with open(image_path, "rb") as image_file:
        return base64.b64encode(image_file.read()).decode("utf-8")


def save_image_from_url(url: str, save_path: str) -> None:
    """从URL下载图片并保存到本地"""
    response = requests.get(url)
    response.raise_for_status()
    with open(save_path, "wb") as f:
        f.write(response.content)


def process_image(
    input_image_path: str, prompt: str, output_path: str = "output.png"
) -> bool:
    """处理图片的主函数"""
    try:
        # 检查输入文件是否存在
        if not Path(input_image_path).exists():
            logger.error(f"输入文件不存在: {input_image_path}")
            return False

        # 编码图片为base64
        logger.info(f"正在读取图片: {input_image_path}")
        base64_image = encode_image_to_base64(input_image_path)

        # 准备请求头和数据
        headers = {
            "Content-Type": "application/json",
            "Authorization": "Bearer "
            + os.getenv("DASHSCOPE_API_KEY", "sk-e5071bf0669d4b8388aaae863174dead"),
        }

        json_data = {
            "model": "qwen-image-edit",
            "input": {
                "messages": [
                    {
                        "role": "user",
                        "content": [
                            {
                                "image": f"data:image/jpeg;base64,{base64_image}",
                            },
                            {
                                "text": prompt,
                            },
                        ],
                    },
                ],
            },
            "parameters": {
                "negative_prompt": "artificial, fake, synthetic, cartoon, anime, painting, drawing, rendered, cgi, 3d render, illustration, digital art, oversaturated, plastic looking, doll-like, smooth skin, perfect lighting, unrealistic lighting, HDR effect, oversharpened, airbrushed, flawless, studio lighting, professional photography, posed, staged, makeup heavy, beauty filter, face filter, instagram filter, overprocessed, too clean, sterile, computer generated, robotic, uncanny valley, glass skin, porcelain skin, wax figure",
                "watermark": False,
            },
        }

        # 发送请求
        logger.info("正在发送API请求...")
        response = requests.post(
            "https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation",
            headers=headers,
            json=json_data,
            timeout=60,
        )

        response.raise_for_status()
        result = response.json()

        # 检查响应状态
        if "output" not in result:
            logger.error(f"API请求失败: {result}")
            return False

        # 提取图片URL
        image_url = result["output"]["choices"][0]["message"]["content"][0]["image"]
        logger.info(f"获取到图片URL: {image_url}")

        # 下载并保存图片
        logger.info(f"正在下载图片到: {output_path}")
        save_image_from_url(image_url, output_path)

        # 打印使用信息
        usage = result.get("usage", {})
        logger.success(
            f"处理完成! 图片尺寸: {usage.get('width')}x{usage.get('height')}, 请求ID: {result.get('request_id')}"
        )

        return True

    except requests.exceptions.RequestException as e:
        logger.error(f"网络请求错误: {e}")
        return False
    except Exception as e:
        logger.error(f"处理失败: {e}")
        return False


if __name__ == "__main__":
    # 配置参数
    INPUT_IMAGE = "demo3.png"

    PROMPT = """换个面部特征，然后保持人物的其他细节：面部特征、然后换个发型;服装、姿势、表情,人物一定要是中国人，然后手机会挡住眼睛和面部。

    背景替换要求：
    - 场景：现代家庭客厅，人物在大型圆形或椭圆形装饰镜子中的反射影像
    - 视角：从镜子外看向镜子，看到镜子中反射的人物自拍
    - 环境：镜子周围是温馨客厅，沙发、茶几、绿植等生活化摆设在镜子外的真实空间
    - 光线：客厅自然光线，从窗户透入，在镜面上有真实的光影反射效果

    镜子效果：
    - 镜面有真实的反射质感，边缘有轻微的镜面畸变
    - 镜子表面可能有细微的灰尘痕迹或指纹，增加真实感
    - 手机屏幕在镜子中也应该有反射效果
    - 保持自拍的镜像对称关系

    拍摄真实感：
    - 手机镜头对着镜子拍摄的角度和距离
    - 保持原图的肌肤真实质感和光线效果
    - 真实的室内色温，自然的景深层次
    - 生活化的瞬间抓拍感

    画质要求：普通手机拍摄镜子的真实效果，包括镜面反射的自然光学特性。"""
    OUTPUT_IMAGE = "result.png"

    # 执行处理
    success = process_image(INPUT_IMAGE, PROMPT, OUTPUT_IMAGE)

    if success:
        logger.success(f"图片处理成功！结果已保存到: {OUTPUT_IMAGE}")
    else:
        logger.error("图片处理失败!")
"""
完全保持人物的所有细节：面部特征、发型、服装、姿势、表情，一丝不变，但更换一张不同的脸，注意人物身材比例，较为高挑。
用手机对着镜子自拍，用手机挡住脸。
背景替换要求：

场景：现代家庭客厅，人物在大型全身镜中的反射影像
视角：从镜子外看向镜子，看到镜子中反射的人物自拍
环境：镜子周围是温馨客厅，沙发、茶几、绿植等生活化摆设在镜子外的真实空间
光线：呈现出典型的室内自然光效果，阳光从画面的窗户（或光源）斜射入室内，形成方向性明确的侧光照明。
光线特性表现为​​温暖柔和​​的质感，在墙面、地面、人物身体和家具表面投下​​清晰而柔和​​的阴影，明暗对比自然，既塑造了空间立体感，又保持了整体氛围的舒适度。光线的入射角度较低，可能是清晨或傍晚时分，阳光强度适中，不刺眼，为场景注入了静谧而温馨的基调。
镜子效果：
镜面有真实的反射质感，边缘有轻微的镜面畸变
镜子表面可能有细微的灰尘痕迹或指纹，增加真实感 拍摄真实感：
保持原图的肌肤真实质感和光线效果
真实的室内色温，自然的景深层次
生活化的瞬间抓拍感
画质要求：手机拍摄镜子的真实效果，包括镜面反射的自然光学特性
"""
